home *** CD-ROM | disk | FTP | other *** search
- /*
- Public domain termios tc[get|set]attr() for the MiNT library
- 10 October 1993 entropy@terminator.rs.itd.umich.edu -- first attempt
- */
-
- #include <mintbind.h>
- #include <types.h>
- #include <errno.h>
- #include <file.h>
- #include <ioctl.h>
- #include <unistd.h>
- #include <types.h>
- #include <termios.h>
-
- int
- tcgetattr(fd, stp)
- int fd;
- struct termios *stp;
- {
- struct sgttyb sg;
- struct tchars t;
- struct ltchars lt;
- short flags;
- long r;
-
- r = Fcntl((short) fd, (long) &sg, TIOCGETP);
- if (r < 0) {
- errno = (int) -r;
- return -1;
- }
- r = Fcntl((short) fd, (long) &t, TIOCGETC);
- if (r < 0) {
- errno = (int) -r;
- return -1;
- }
- r = Fcntl((short) fd, (long) <, TIOCGLTC);
- if (r < 0) {
- errno = (int) -r;
- return -1;
- }
- r = Fcntl((short) fd, (long) &flags, TIOCGFLAGS);
- if (r < 0) {
- flags = 0;
- }
- stp->c_iflag = (tcflag_t) (IGNBRK
- | ((sg.sg_flags & CRMOD) ? ICRNL : 0)
- | ((sg.sg_flags & (EVENP | ODDP)) ? INPCK : IGNPAR)
- | ((sg.sg_flags & TANDEM) ? (IXON | IXOFF) : 0));
- stp->c_oflag = (tcflag_t) OPOST;
- stp->c_cflag = (tcflag_t) (CLOCAL | CREAD
- | (((flags & _TF_STOPBITS) == _TF_2STOP) ? CSTOPB : 0)
- | ((sg.sg_flags & EVENP) ? PARENB : 0)
- | ((sg.sg_flags & ODDP) ? (PARENB | PARODD) : 0));
- switch (flags & _TF_CHARBITS)
- {
- case _TF_5BIT:
- stp->c_cflag |= CS5;
- break;
- case _TF_6BIT:
- stp->c_cflag |= CS6;
- break;
- case _TF_7BIT:
- stp->c_cflag |= CS7;
- break;
- case _TF_8BIT:
- default:
- stp->c_cflag |= CS8;
- break;
- }
- stp->c_lflag = (tcflag_t) ((sg.sg_flags & (TOSTOP | NOFLSH))
- | ((sg.sg_flags & ECHO) ? (ECHO | ECHOE | ECHOK) : 0)
- | ((sg.sg_flags & XKEY) ? IEXTEN : 0)
- | ((sg.sg_flags & RAW)
- ? 0
- : ISIG | (sg.sg_flags & CBREAK ? 0 : ICANON)));
- stp->_c_ispeed = (speed_t) sg.sg_ispeed;
- stp->_c_ospeed = (speed_t) sg.sg_ospeed;
- stp->c_cc[VEOF] = (cc_t) t.t_eofc;
- stp->c_cc[VEOL] = (cc_t) t.t_brkc;
- stp->c_cc[VERASE] = (cc_t) sg.sg_erase;
- stp->c_cc[VINTR] = (cc_t) t.t_intrc;
- stp->c_cc[VKILL] = (cc_t) sg.sg_kill;
- stp->c_cc[VQUIT] = (cc_t) t.t_quitc;
- stp->c_cc[VSUSP] = (cc_t) lt.t_suspc;
- stp->c_cc[VSTART] = (cc_t) t.t_startc;
- stp->c_cc[VSTOP] = (cc_t) t.t_stopc;
- stp->c_cc[VMIN] = (cc_t) 1;
- stp->c_cc[VTIME] = (cc_t) 0;
- stp->c_cc[VLNEXT] = (cc_t) lt.t_lnextc;
- stp->c_cc[VWERASE] = (cc_t) lt.t_werasc;
- return 0;
- }
-
- int
- tcsetattr(fd, action, stp)
- int fd;
- int action;
- const struct termios *stp;
- {
- struct sgttyb sg;
- struct tchars t;
- struct ltchars lt;
- short flags;
- long r;
-
- r = Fcntl((short) fd, (long) &sg, TIOCGETP);
- if (r < 0) {
- errno = (int) -r;
- return -1;
- }
- r = Fcntl((short) fd, (long) <, TIOCGLTC);
- if (r < 0) {
- errno = (int) -r;
- return -1;
- }
- r = Fcntl((short) fd, (long) &flags, TIOCGFLAGS);
- if (r < 0) {
- flags = 0;
- }
- sg.sg_flags &= ~(CRMOD | TANDEM | EVENP | ODDP | TOSTOP
- | NOFLSH | RAW | CBREAK | ECHO | XKEY);
- flags &= ~(_TF_STOPBITS | _TF_CHARBITS);
- sg.sg_flags |= (((stp->c_iflag & ICRNL) ? CRMOD : 0)
- | ((stp->c_iflag & (IXON | IXOFF)) ? TANDEM : 0));
- flags |= ((stp->c_cflag & CSTOPB) ? _TF_2STOP : _TF_1STOP);
- sg.sg_flags |= ((stp->c_cflag & PARENB)
- ? ((stp->c_cflag & PARODD) ? ODDP : EVENP)
- : 0);
- switch (stp->c_cflag & (CS5 | CS6 | CS7 | CS8))
- {
- case CS5:
- flags |= _TF_5BIT;
- break;
- case CS6:
- flags |= _TF_6BIT;
- break;
- case CS7:
- flags |= _TF_7BIT;
- break;
- case CS8:
- default:
- flags |= _TF_8BIT;
- break;
- }
- sg.sg_flags |= ((stp->c_lflag & (TOSTOP | NOFLSH | ECHO))
- | ((stp->c_lflag & IEXTEN) ? XKEY : 0)
- | ((stp->c_lflag & ISIG)
- ? (stp->c_lflag & ICANON ? 0 : CBREAK) : RAW));
- sg.sg_ispeed = (char) stp->_c_ispeed;
- sg.sg_ospeed = (char) stp->_c_ospeed;
- t.t_eofc = (char) stp->c_cc[VEOF];
- t.t_brkc = (char) stp->c_cc[VEOL];
- sg.sg_erase = (char) stp->c_cc[VERASE];
- t.t_intrc = (char) stp->c_cc[VINTR];
- sg.sg_kill = (char) stp->c_cc[VKILL];
- t.t_quitc = (char) stp->c_cc[VQUIT];
- lt.t_suspc = (char) stp->c_cc[VSUSP];
- t.t_startc = (char) stp->c_cc[VSTART];
- t.t_stopc = (char) stp->c_cc[VSTOP];
- lt.t_lnextc = (char) stp->c_cc[VLNEXT];
- lt.t_werasc = (char) stp->c_cc[VWERASE];
- switch (action)
- {
- case TCSAFLUSH:
- tcflush(fd, TCIFLUSH);
- /* fall through */
- case TCSADRAIN:
- r = Fcntl((short) fd, (long) &sg, TIOCSETP);
- if (r < 0) {
- errno = (int) -r;
- return -1;
- }
- break;
- case TCSANOW:
- r = Fcntl((short) fd, (long) &sg, TIOCSETN);
- if (r < 0) {
- errno = (int) -r;
- return -1;
- }
- break;
- default:
- errno = EINVAL;
- return -1;
- }
- r = Fcntl((short) fd, (long) &t, TIOCSETC);
- if (r < 0) {
- errno = (int) -r;
- return -1;
- }
- r = Fcntl((short) fd, (long) <, TIOCSLTC);
- if (r < 0) {
- errno = (int) -r;
- return -1;
- }
- (void) Fcntl((short) fd, (long) &flags, TIOCSFLAGS);
- return 0;
- }
-